const express = require('express');
const router = express.Router();
const db = require('../models');

// 管理员认证中间件
const adminAuth = (req, res, next) => {
  // 简单实现基于session的认证
  if (req.session && req.session.adminLoggedIn) {
    return next();
  }
  
  // 如果是API请求返回401
  const acceptHeader = req.headers.accept || '';
  if (req.xhr || acceptHeader.includes('json')) {
    return res.status(401).json({ error: '需要管理员权限' });
  }
  
  // 否则重定向到登录页
  res.redirect('/admin/login');
};

// 用户管理
router.get('/users', adminAuth, async (req, res) => {
  try {
    const users = await db.User.findAll({
      attributes: ['id', 'openid', 'nickname', 'subscribeTime', 'status']
    });
    res.render('admin/users', { 
      users,
      layout: false 
    });
  } catch (err) {
    console.error('获取用户列表失败:', err);
    res.status(500).send('获取用户列表失败');
  }
});

// 禁用用户
router.post('/users/:id/disable', adminAuth, async (req, res) => {
  try {
    await db.User.update({ status: 0 }, { where: { id: req.params.id } });
    res.sendStatus(200);
  } catch (err) {
    console.error('禁用用户失败:', err);
    res.status(500).send('禁用用户失败');
  }
});

// 启用用户
router.post('/users/:id/enable', adminAuth, async (req, res) => {
  try {
    await db.User.update({ status: 1 }, { where: { id: req.params.id } });
    res.sendStatus(200);
  } catch (err) {
    console.error('启用用户失败:', err);
    res.status(500).send('启用用户失败');
  }
});

// 更新用户信息
router.put('/users/:id', adminAuth, async (req, res) => {
  try {
    const { nickname } = req.body;
    await db.User.update({ nickname }, { where: { id: req.params.id } });
    res.sendStatus(200);
  } catch (err) {
    console.error('更新用户失败:', err);
    res.status(500).send('更新用户失败');
  }
});

// 订阅管理
router.get('/subscriptions', adminAuth, async (req, res) => {
  try {
    const subscriptions = await db.Subscription.findAll({
      include: [{ model: db.User, attributes: ['nickname', 'openid'] }]
    });
    res.render('admin/subscriptions', { subscriptions });
  } catch (err) {
    console.error('获取订阅列表失败:', err);
    res.status(500).send('获取订阅列表失败');
  }
});

// 禁用订阅
router.post('/subscriptions/:id/disable', adminAuth, async (req, res) => {
  try {
    await db.Subscription.update({ status: 0 }, { where: { id: req.params.id } });
    res.sendStatus(200);
  } catch (err) {
    console.error('禁用订阅失败:', err);
    res.status(500).send('禁用订阅失败');
  }
});

// 启用订阅
router.post('/subscriptions/:id/enable', adminAuth, async (req, res) => {
  try {
    await db.Subscription.update({ status: 1 }, { where: { id: req.params.id } });
    res.sendStatus(200);
  } catch (err) {
    console.error('启用订阅失败:', err);
    res.status(500).send('启用订阅失败');
  }
});

// 推送记录
router.get('/push-records', adminAuth, async (req, res) => {
  try {
    const records = await db.PushRecord.findAll({
      include: [
        { model: db.User, attributes: ['nickname', 'openid'] },
        { model: db.Subscription, attributes: ['cityName'] }
      ],
      order: [['pushTime', 'DESC']],
      limit: 100
    });
    res.render('admin/push-records', { records });
  } catch (err) {
    console.error('获取推送记录失败:', err);
    res.status(500).send('获取推送记录失败');
  }
});

// 重试推送
router.post('/push-records/:id/retry', adminAuth, async (req, res) => {
  try {
    const record = await db.PushRecord.findByPk(req.params.id, {
      include: [
        { model: db.User },
        { model: db.Subscription }
      ]
    });
    
    if (!record) {
      return res.status(404).send('记录不存在');
    }

    // 调用推送服务重新执行推送
    const pushService = require('../services/pushService');
    await pushService.retryPush(record);
    
    res.sendStatus(200);
  } catch (err) {
    console.error('重试推送失败:', err);
    res.status(500).send('重试推送失败');
  }
});

// 登录页面
router.get('/login', (req, res) => {
  res.render('admin/login', { 
    error: null 
  });
});

// 处理登录
router.post('/login', (req, res) => {
  const { username, password } = req.body;
  
  // 这里应该从数据库或配置中验证管理员凭据
  // 示例使用硬编码凭据，生产环境应使用数据库存储和加密密码
  // 从环境变量获取管理员凭据
  const ADMIN_USERNAME = process.env.ADMIN_USERNAME || 'admin';
  const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'admin123';
  
  if (username === ADMIN_USERNAME && password === ADMIN_PASSWORD) {
    req.session.adminLoggedIn = true;
    res.redirect('/admin/users');
  } else {
    res.render('admin/login', { error: '用户名或密码错误' });
  }
});

// 退出登录
router.get('/logout', (req, res) => {
  req.session.destroy();
  res.redirect('/admin/login');
});

module.exports = router;